package com.ruoyi.service.message.enums;

import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.core.exception.ServiceException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import lombok.Getter;

/**
 * <p>
 * 作用：消息
 * </p>
 *
 * @author Zane
 * @since 2025-10-25 10:17
 */
@Getter
public enum MessageTemplateEnum {
  /**
   * A1, 项目负责人任命通知；A2, 项目开始通知；A3, 项目交付通知；A4, 项目验收通知；A5, 项目评价通知；A6, 项目评价通知；A7, 项目评价通知；A8, 项目结算通知；A9,
   * 薪资发放通知；A10, 平台认证通知；A11, 认证取消通知；A12, 个人注册成功通知；A13, 个人注册失败通知；A14, 公司注册成功通知；A15, 公司注册失败通知；A16,
   * 项目延期通知；A17, 项目延期通知；A18, 获得评价通知；A19-1, 获得评价通知（项目方）;A19-2, 获得评价通知（项目 leader）;A20, 项目录用通知；A21,
   * 项目离岗通知 properties 项目名称 : projectName 结算时间 : settleTime
   */
  A1("A1", "项目负责人任命通知", MessageTypeEnum.PROJECT_MSG,
      "您已经被任命为【{projectName}】的执行负责人，请查看项目详情，与项目方保持沟通"),
  A2("A2", "项目开始通知", MessageTypeEnum.PROJECT_MSG,
      "您参与的【{projectName}】项目已开始执行，请明确自己的任务，与项目负责人保持沟通"),
  A3("A3", "项目交付通知", MessageTypeEnum.PROJECT_MSG,
      "您负责的【{projectName}】项目，所有成员已完成项目交付，请验收项目成员的工作成果，并提交项目报告和备用金使用明细（如有）"),
  A4("A4", "项目验收通知", MessageTypeEnum.PROJECT_MSG,
      "您负责的【{projectName}】项目已提交验收报告，请对本项目进行验收"),
  A5("A5", "项目评价通知", MessageTypeEnum.PROJECT_MSG,
      "您负责的【{projectName}】项目已完成验收工作，请对本项目参与的人员进行评价"),
  A6("A6", "项目评价通知", MessageTypeEnum.PROJECT_MSG,
      "您参与的【{projectName}】项目已完成验收工作，请对本项目的项目方进行评价"),
  A7("A7", "项目评价通知", MessageTypeEnum.PROJECT_MSG,
      "您参与的【{projectName}】项目已完成验收工作，请对本项目的制作成员进行评价"),
  A8("A8", "项目结算通知", MessageTypeEnum.PROJECT_MSG,
      "您负责的【{projectName}】项目，已完成结算，其中备用金【系统计算】元，薪资【系统计算】元，平台扣点【系统计算】元，请核对。"),
  A9("A9", "薪资发放通知", MessageTypeEnum.PROJECT_MSG,
      "您参与的【{projectName}】项目已结算，你的薪资为【系统计算】元，请核对。"),
  A10("A10", "平台认证通知", MessageTypeEnum.SYSTEM_MSG,
      "恭喜您，被平台认证为项目负责人，可以作为项目 leader 领导项目。最终解释权归平台所有"),
  A11("A11", "认证取消通知", MessageTypeEnum.SYSTEM_MSG,
      "很抱歉，平台已取消对您的认证，暂时不可以作为项目 leader 领导项目。最终解释权归平台所有"),
  //  A12("A12", "个人注册成功通知", "个人注册成功通知"),
//  A13("A13", "个人注册失败通知", "个人注册失败通知"),
  A14("A14", "公司注册成功通知", MessageTypeEnum.SYSTEM_MSG,
      "恭喜您，公司注册成功，可以在本平台发布项目。最终解释权归平台所有"),
  A15("A15", "公司注册失败通知", MessageTypeEnum.SYSTEM_MSG,
      "很遗憾，本次审批未能通过。最终解释权归平台所有。【{checkRemark}】"),
  A16("A16", "项目延期通知", MessageTypeEnum.PROJECT_MSG,
      "您负责的【{projectName}】项目，未能在【{projectEndTime}】前提交项目报告，详细情况请与项目执行负责人联系。"),
  A17("A17", "项目延期通知", MessageTypeEnum.PROJECT_MSG,
      "您负责的【{projectName}】项目，未能在【{projectEndTime}】前提交项目报告，请尽快提交验收报告并与项目方保持沟通通畅。"),
  A18("A18", "获得评价通知", MessageTypeEnum.EVALUATION_MSG,
      "您负责的【{projectName}】项目，已获得参与人员的评价，请查阅。"),
  A19_1("A19-1", "获得评价通知", MessageTypeEnum.EVALUATION_MSG,
      "您参与的【{projectName}】项目，已获得项目方的评价，请查阅。"),
  A19_2("A19-2", "获得评价通知", MessageTypeEnum.EVALUATION_MSG,
      "您参与的【{projectName}】项目，已获得项目 leader 的评价，请查阅。"),
  A20("A20", "项目录用通知", MessageTypeEnum.PROJECT_MSG,
      "您已被【{projectName}】项目录用为【{postName}】，请尽快与项目 leader 沟通，按时完成任务，合作愉快。"),
  A21("A21", "项目离岗通知", MessageTypeEnum.PROJECT_MSG,
      "您将不再参与的【{projectName}】项目，详细情况请与项目执行负责人联系。");

  /**
   * 编码
   */
  private final String code;
  /**
   * 主题
   */
  private final String topic;
  /**
   * 模板
   */
  private final String template;
  /**
   * 类型
   */
  private final MessageTypeEnum type;

  MessageTemplateEnum(String code, String topic, MessageTypeEnum type, String template) {
    this.code = code;
    this.topic = topic;
    this.type = type;
    this.template = template;
  }

  public boolean eqCode(String code) {
    return this.code.equals(code);
  }

  public String getMessage(Map<String, String> properties) {
    if (Objects.isNull(properties) || properties.isEmpty()) {
      return this.template;
    }
    return StrUtil.format(this.template, properties);
  }

  public static MessageTemplateEnum valueOfCode(String code) {
    for (MessageTemplateEnum value : values()) {
      if (value.code.equals(code)) {
        return value;
      }
    }
    throw new ServiceException("未定义的消息模板");
  }

  public static void main(String[] args) {
    System.out.println(MessageTemplateEnum.A1.getMessage(new HashMap<String, String>() {{
      put("projectName", "项目1");
    }}));
  }
}
